﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using System.Collections.ObjectModel;
using System.Globalization;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FRMrepDanPro.xaml
    /// </summary>
    public partial class FRMrepDanPro : Window
    {
        public FRMrepDanPro()
        {
            InitializeComponent();
        }

        private void butGua_Click(object sender, RoutedEventArgs e)
        {
            repDanPro.Instance.guardar();
            texOrd.Focus();
            texOrd.Select(0,0);
        }

        private void butSal_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            repDanPro.Instance = null;
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Keyboard.Focus(texOrd);
        }

        private void dataGrid1_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void dtRepDan_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        }

    }

    public class repDanPro:ObservableObject 
    { 
        #region singleton

        private static repDanPro instance = null;

        protected repDanPro() 
        {
            consRep();
            consLisPie();
            consLisEmp();
            consLisCau();
            consLisSol();

            MDOgeneral.conectar();
            strTituloVentana = "Reporte de daños de producción - Usuario: " + MDOgeneral.usuario + " - [FRMrepDanPro]";
        }


        public static repDanPro Instance
        {
            get
            {
                if (instance == null)
                    instance = new repDanPro();
                return instance;
            }
           set 
           { 
              if (instance != null)
                instance = null;
           }
        }

        #endregion

        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; RaisePropertyChangedEvent("strTituloVentana"); }
        }

        public clases.CLSENCORDP encdp = new clases.CLSENCORDP();

        public void consEncOrd() 
        {
            try 
            {
                encdp.NROORD_EOP = orden;
                encdp.conEncBasicOrd();
                fecha = encdp.FECORD_EOP;
                referencia = encdp.inforef.NOMREF_REF;
                color = encdp.inforef.infocol.NOMCOL_COL;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private string _orden;
        public string orden 
        {
            get { return _orden; }
            set 
            { 
                _orden = value;
                if(_orden!=null)
                {
                    if (_orden.Length > 5)
                    {
                        consLisTal();
                        consEncOrd();
                        consRepOrd();
                    }
                }
                RaisePropertyChangedEvent("orden");
            }
        }

        private DateTime _fecha=DateTime.Today;
        public DateTime fecha 
        {
            get { return _fecha; }
            set 
            { 
                _fecha = value;
                consRep();
                RaisePropertyChangedEvent("fecha");
            }
        }

        private string _referencia;
        public string referencia 
        {
            get { return _referencia; }
            set { _referencia = value; RaisePropertyChangedEvent("referencia"); }
        }

        private string _color;
        public string color 
        {
            get { return _color; }
            set { _color = value; RaisePropertyChangedEvent("color"); }
        }
        
        private List<clases.CLSMAESEC> _secciones = new clases.CLSMAESEC().listarSecciones();
        public List<clases.CLSMAESEC> secciones 
        {
            get { return _secciones; }
            set { _secciones = value; RaisePropertyChangedEvent("secciones"); }
        }

        private string _codsec;
        public string codsec
        {
            get { return _codsec; }
            set
            {
                _codsec = value;
                if (!String.IsNullOrEmpty(_codsec)) 
                {
                    lisReporte.Clear();
                    consLisDan();
                    consRepOrd();
                }
                RaisePropertyChangedEvent("codsec");
            }
        }
           
        private DataTable _reportefec = new DataTable();
        public DataTable reportefec
        {
            get { return _reportefec; }
            set{_reportefec=value; RaisePropertyChangedEvent("reportefec"); }
        }
        
        private ObservableCollection<reporte> _lisReporte = new ObservableCollection<reporte>();
        public ObservableCollection<reporte> lisReporte 
        {
            get { return _lisReporte; }
            set { _lisReporte = value; RaisePropertyChangedEvent("lisReporte"); }
        }

        private reporte _SelReporte = new reporte();
        public reporte SelReporte
        {
            get { return _SelReporte; }
            set { _SelReporte = value; RaisePropertyChangedEvent("SelReporte"); }
        }
               
        public void consRep() 
        {
            try 
            {
                clases.CLSNOCPRD noc = new clases.CLSNOCPRD {FECHA_NCP=fecha};
                reportefec = noc.consDanFec();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void consLisDan()
        {
            try
            {
                clases.CLSTABDAN tabdan = new clases.CLSTABDAN {  SECDAN_DAN = codsec.Trim() };
                lisDan = tabdan.listarDano();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private DataTable _lisDan = new DataTable();
        public DataTable lisDan
        {
            get { return _lisDan; }
            set { _lisDan = value; RaisePropertyChangedEvent("lisDan"); }
        }

        public void consLisTal()
        {
            try
            {
                clases.CLSDETORDP detord = new clases.CLSDETORDP { NROORD_DOP = orden.Trim() };
                lisTal = detord.consTallas();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        private DataTable _lisTal = new DataTable();
        public DataTable lisTal
        {
            get { return _lisTal; }
            set { _lisTal = value; RaisePropertyChangedEvent("lisTal"); }
        }
        
        public void consLisPie()
        {
            try
            {
                clases.CLSTABPIE tabp = new clases.CLSTABPIE();
                lisPie = tabp.consLisPie();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        private DataTable _lisPie = new DataTable();
        public DataTable lisPie
        {
            get { return _lisPie; }
            set { _lisPie = value; RaisePropertyChangedEvent("lisPie"); }
        }

        public void consLisEmp()
        {
            try
            {
                clases.CLSMAEEMPP emp = new clases.CLSMAEEMPP();
                lisEmp = emp.consLisEmp();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        private DataTable _lisEmp = new DataTable();
        public DataTable lisEmp
        {
            get { return _lisEmp; }
            set { _lisEmp = value; RaisePropertyChangedEvent("lisEmp"); }
        }

        public void consLisCau()
        {
            try
            {
                clases.CLSTABCAU cau = new clases.CLSTABCAU();
                lisCau = cau.consLisCau();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        private DataTable _lisCau = new DataTable();
        public DataTable lisCau
        {
            get { return _lisCau; }
            set { _lisCau = value; RaisePropertyChangedEvent("lisCau"); }
        }
        
        public void consLisSol()
        {
            try
            {
                clases.CLSTABSOL sol = new clases.CLSTABSOL();
                lisSol = sol.consLisSol();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        private DataTable _lisSol = new DataTable();
        public DataTable lisSol
        {
            get { return _lisSol; }
            set { _lisSol = value; RaisePropertyChangedEvent("lisSol"); }
        }

        clases.CLSNOCPRD objnocprd = new clases.CLSNOCPRD();
        public void guardar() 
        {
            try 
            {
                foreach (reporte r in lisReporte)
                {
                    if (!r.EXISTE && !String.IsNullOrEmpty(r.codtal))
                    {
                        objnocprd.lisNocPrd.Add(new clases.CLSNOCPRD
                        {
                            CAUSA_NCP = r.codcau,
                            CODCOL_NCP = encdp.inforef.infocol.CODCOL_COL,
                            CODDAN_NCP = r.coddan,
                            CODPIE_NCP = r.codpie,
                            CODPRC_NCP = codsec,
                            CODREF_NCP = encdp.CODREF_EOP,
                            EMPDEC_NCP = r.coddec,
                            EMPINF_NCP = r.codinf,
                            EMPRES_NCP = r.codres,
                            FECHA_NCP = DateTime.Today,
                            NROPIE_NCP = r.cantidad,
                            OBSERV_NCP = r.observa,
                            ORDNRO_NCP = encdp.NROORD_EOP.Trim(),
                            QUEHACER_NCP = r.codsol,
                            TALLA_NCP = r.codtal,
                        });
                    }
                }
                if (objnocprd.guaMultiple())
                {
                    msn.texto = "Los reportes de daños fueron guardados correctamente.";
                    msn.tipo = true;
                    consRepOrd();
                    ERRORG = true;
                }
                else
                {
                    msn.texto = "Los reportes de daños no pueden ser guardados.";
                    msn.tipo = false;                
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void consRepOrd() 
        {
            try 
            {
                ERRORG = true;
                lisReporte.Clear();
                clases.CLSNOCPRD noc = new clases.CLSNOCPRD {CODPRC_NCP=codsec,ORDNRO_NCP=orden};
                DataTable val=noc.consDanOrd();
                foreach(DataRow r in val.Rows){
                    lisReporte.Add(new reporte {
                        codtal = r["TALLA_NCP"].ToString().Trim(),
                        coddan = r["CODDAN_NCP"].ToString().Trim(),
                        codpie = r["CODPIE_NCP"].ToString().Trim(),
                        codinf = r["EMPINF_NCP"].ToString().Trim(),
                        codres = r["EMPRES_NCP"].ToString().Trim(),
                        codcau = r["CAUSA_NCP"].ToString().Trim(),
                        codsol = r["QUEHACER_NCP"].ToString().Trim(),
                        coddec = r["EMPDEC_NCP"].ToString().Trim(),
                        cantidad=Convert.ToInt32(r["NROPIE_NCP"]),
                        observa = r["OBSERV_NCP"].ToString().Trim(),
                        consec = Convert.ToInt32(r["CONSEC_NCP"]),
                        EXISTE=true
                    });
              

                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        Boolean _ERRORG = false;
        public Boolean ERRORG 
        {
            get {return _ERRORG; }
            set {_ERRORG = value; RaisePropertyChangedEvent("ERRORG"); }
        }

        MDOgeneral.mensaje _msn = new MDOgeneral.mensaje();
        public MDOgeneral.mensaje msn 
        {
            get { return _msn; }
            set { _msn = value; RaisePropertyChangedEvent("msn"); }
        }

        public class reporte:ObservableObject 
        {
            private string _codtal;
            public string codtal 
            {
                get { return _codtal; }
                set { _codtal = value; RaisePropertyChangedEvent("codtal"); }
            }

            private string _coddan;
            public string coddan 
            {
                get { return _coddan; }
                set { _coddan = value; RaisePropertyChangedEvent("coddan"); }
            }

            private string _codpie;
            public string codpie 
            {
                get { return _codpie; }
                set { _codpie = value; RaisePropertyChangedEvent("codpie"); }
            }

            private string _codinf;
            public string codinf
            {
                get { return _codinf; }
                set { _codinf = value; RaisePropertyChangedEvent("codinf"); }
            }

            private string _codres;
            public string codres
            {
                get { return _codres; }
                set { _codres = value; RaisePropertyChangedEvent("codres"); }
            }

            private string _codcau;
            public string codcau
            {
                get { return _codcau; }
                set { _codcau = value; RaisePropertyChangedEvent("codcau"); }
            }

            private string _codsol;
            public string codsol
            {
                get { return _codsol; }
                set { _codsol=value; RaisePropertyChangedEvent("codsol"); }
            }

            private string _coddec;
            public string coddec
            {
                get { return _coddec; }
                set { _coddec = value; RaisePropertyChangedEvent("coddec"); }
            }

            private int _cantidad;
            public int cantidad
            {
                get { return _cantidad; }
                set { _cantidad = value; RaisePropertyChangedEvent("cantidad"); }
            }

            private string _observa;
            public string observa
            {
                get { return _observa; }
                set { _observa = value; RaisePropertyChangedEvent("observa"); }
            }

            private int _consec;
            public int consec 
            {
                get { return _consec; }
                set { _consec = value; RaisePropertyChangedEvent("consec"); }
            }

            private Boolean _EXISTE = false;
            public Boolean EXISTE 
            {
                get { return _EXISTE; }
                set { _EXISTE = value; RaisePropertyChangedEvent("EXISTE"); }
            }

        }
    
    }
   
}

namespace ReglasValidacion
{
    //validar equipo produccion
    public class esOKrepDanPro : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            produccion.forms.repDanPro.reporte sel = produccion.forms.repDanPro.Instance.SelReporte;
            produccion.forms.repDanPro.Instance.ERRORG = true;

            if (!String.IsNullOrEmpty(sel.codtal))
            {
                if (String.IsNullOrEmpty(sel.coddan))
                {
                    return new ValidationResult(false, "Debe seleccionar un daño valido.");
                }
                if (String.IsNullOrEmpty(sel.codpie))
                {
                    return new ValidationResult(false, "Debe seleccionar una pieza valida.");
                }
                if (String.IsNullOrEmpty(sel.codinf))
                {
                    return new ValidationResult(false, "Debe seleccionar un informante valido.");
                }
                if (String.IsNullOrEmpty(sel.codres))
                {
                    return new ValidationResult(false, "Debe seleccionar un responsable valido.");
                }
                if (String.IsNullOrEmpty(sel.codres))
                {
                    return new ValidationResult(false, "Debe seleccionar un responsable valido.");
                }

                if (String.IsNullOrEmpty(sel.codcau))
                {
                    return new ValidationResult(false, "Debe seleccionar una causa valida.");
                }

                if (String.IsNullOrEmpty(sel.codsol))
                {
                    return new ValidationResult(false, "Debe seleccionar una solucion valida.");
                }

                if (String.IsNullOrEmpty(sel.coddec))
                {
                    return new ValidationResult(false, "Debe seleccionar un empleado valido que Decide.");
                }

                ValidationResult r = new esOKentero { Maxc = 2, Minc = 1, Minv = "0", Maxv = "*" }.Validate(sel.cantidad, cultureInfo);
                if (!r.IsValid)
                {
                    return new ValidationResult(false, r.ErrorContent.ToString().Replace("El campo", "Cantidad"));
                }

                r=new esOKcadena{ Maxc = 100, Minc = 1}.Validate(sel.observa,cultureInfo);
                if (!r.IsValid) 
                {
                    return new ValidationResult(false,r.ErrorContent.ToString().Replace("El campo", "Observacion"));
                }
            }

            produccion.forms.repDanPro.Instance.ERRORG = false;
            return new ValidationResult(true, null);
        }
    }

}
